#include "main.h"
#include "Bsp.h"

Flow_Str Flow_Control;

/*********************** User App ************************/

fsm_sta_t System_App(void)
{
    if (Flow_Control.Status & Sys_Init_Evt)
    {
        FSM_Task_Start(Flow_Control, Sys_Time_Evt, 10);

        Init_Bsp();
        SysTick_Start();     //启动Systick
        Enable_Interrupt();

        return Flow_Control.Status ^= Sys_Init_Evt;
    }
    
    if (Flow_Control.Status & Sys_Time_Evt)
    {
        P32 = !P32;
        
        FSM_Task_Start(Flow_Control, Sys_Time_Evt, 2000);

        // if ((PWR_Down_Pin || USB_IN_Pin) && (Flow_Control.BatV_SuperLow_Sta == 0))
        // {
        //     Flow_Control.PWR_Down_Delay = 0;
        // }
        // else
        // {
        //     if (++Flow_Control.PWR_Down_Delay >= 100)
        //     {
        //         FSM_Task_Start(Flow_Control, Sys_IDLE_Evt, 0);
        //     }
        // }

        return Flow_Control.Status ^= Sys_Time_Evt;
    }

    if (Flow_Control.Status & Sys_IDLE_Evt)
    {
        Disable_Interrupt();

        FSM_Task_Init(Flow_Control);

        // 自动唤醒 | 否则关闭看门狗
        // SWDTEN = 0;

        // 关闭外设 | GPIO | ADC
        
        // 设置唤醒Pin

        // asm("nop");	 //
        // SLEEP();
        // asm("nop");	 //
        // asm("nop");	 //

        // 允许唤醒条件
        // if (Flow_Control.BatV_SuperLow_Sta == 0 || USB_IN_Pin)
        // {
        //     SWDTEN = 1;  //看门狗

        //     FSM_Task_Start(Flow_Control, Sys_Init_Evt, 0);
        // }
        // else
        {
            FSM_Task_Start(Flow_Control, Sys_IDLE_Evt, 0);
        }

        return Flow_Control.Status;
    }

    return 0;
}

void main(void)
{
    FSM_Task_Init(Flow_Control);

    // 运行初始化任务
    FSM_Task_Start(Flow_Control, Sys_Init_Evt, 0);
    
    for ( ; ; )
    {
        if (Flow_Control.Run)
        {
            Flow_Control.Run = System_App();
        }

        // 喂狗
        // CLRWDT();
    }
}

/* SysTick中断 =======================================================*/
void SysTick_ISR() interrupt 1 using 1 
{
    FSM_Timer_Run(Flow_Control);
}
